package cn.tedu.v3;
/**
 * 多人聊天室version 3
 * Server 服务器：找到CS多线程类
 * 1.读入放入线程中
 * 2.写出直接写在run方法
 */

import java.io.*;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Scanner;

public class Server {
    private ServerSocket serverSocket;

    public Server() {
        try {
            serverSocket = new ServerSocket(1234);
        } catch (BindException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void start() {
        Socket socket = null;
        String ip = null;
        try {
            while (true) {
                System.out.println("等待客户端的连接");
                socket = serverSocket.accept();
                ip = socket.getInetAddress().getHostAddress();
                System.out.println("客户端：" + ip + "连接上了");
                new Thread(new CS(socket)).start();
            }
        } catch (IOException e) {
            System.out.println(ip + "客户端链接失效~~");
        } finally {
            if (serverSocket != null && !serverSocket.isClosed()) {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    System.out.println("服务器关闭失败~~");
                }
                System.out.println("服务器关闭成功~~");
            }
        }
    }

    public static void main(String[] args) {
        Server server = new Server();
        server.start();
    }

    private class CS implements Runnable {

        private Socket socket;
        private String ip;

        public CS(Socket s) {
            this.socket = s;
            ip = socket.getInetAddress().getHostAddress();
        }

        @Override
        public void run() {

            PrintWriter pw = null;
                try {
                    //1.输出流--输入流读入功能：存入线程中
                    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF8"));
                    pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8")), true);
                    new Thread(()->{
                        try {
                            String message;
                            while ((message = br.readLine()) != null) {
                                System.out.println( message);
                                //1.6增加一句--每次客户端发给服务器端内容
                                System.out.println("服务器请输入：");
                            }
                        } catch (IOException e) {
                            System.out.println("服务器端发来的信息断开了");
                        }
                    }).start();

                    //System.out.println("客户端用户请输入你的文字内容：");
                    //1.5.1控制台卡住--输入内容
                    Scanner input = new Scanner(System.in);
                    //1.5.2一直进行写出
                    while (true) {
                        //String str = br.readLine();
                        //System.out.println(ip + "客户端：" + str);
                        System.out.println("服务器输入");
                        String say = input.nextLine();
                        pw.println("服务器说：" + say);
                        //System.out.println("写出完毕");
                    }
                } catch (UnsupportedEncodingException e) {
                    System.out.println("服务器端与客户端连接不一致");
                } catch (SocketException e) {
                    System.out.println("");
                } catch (IOException e) {
                    System.out.println("客户端链接失效");
                } finally {
                    /*if (br != null)
                        try {
                            br.close();
                        } catch (IOException e) {
                            System.out.println("读入流断开链接");
                        }*/
                    if (pw != null)
                        pw.close();
                    if (socket != null && !socket.isClosed()) {
                        System.out.println(ip + "一个客户端退出服务器链接");
                        try {
                            socket.close();
                        } catch (IOException e) {
                            System.out.println(ip + "一个客户端退出链接异常~~");
                        }
                    }
                }
        }
    }
}
